home *** CD-ROM | disk | FTP | other *** search
-
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
-
- #include <glib.h>
- #include <strlib.h>
-
- #define col0 0
- #define col6 6
-
- /* xy check return( yes=1, no=0 ) */
- int sed_xychk(int x, int y, int x1, int y1, int x2, int y2)
- {
- if (x1<=x && x<=x2 && y1<=y && y<=y2) return(1);
- return(0);
- }
-
- /*
- 汎用質問プログラム
- */
- int qas(int lx, int ly, char qq[], char aa[], int max)
- {
- int xx,i, j, k;
- char ans[64], wks[100];
-
- locate( lx,ly,COFF);
- symbol_( 8*lx, 16*ly, qq, 1, 1, col6, 0, PSET);
- xx = lx + strlen(qq);
- /* sprintf(ans, "%s", aa); */
- color(2, 0);
- i = sedline(xx, ly, aa);
- /* strcpy(aa, ans); */
- k = strlen(aa);
- j = 0;
- locate( xx, ly,COFF);
- while (j < k) {
- printf(" ");
- j++;
- }
- color( 7, 0);
- locate( 0,0,COFF);
- aa[max] = '\0';
- sprintf(wks, "%s%s", qq, aa);
- symbol_( 8*lx, 16*ly, wks, 1, 1, col0, 0, PSET);
- return(i);
- }
-
-
- int qyn(lx, ly, qq)
- int lx,ly;
- char *qq;
- {
- int i;
-
- color( 6, 0);
- locate( lx,ly,COFF);
- printf("%s\n", qq);
- locate( lx, ly,CON);
- i = getch();
- color( 4, 0);
- locate( lx,ly,CON);
- printf("%s\n", qq);
- return(i);
- }
-
- /*
- xl , yl カーソル位置 lin 入力文字バッファ lim 最大文字数
- return時の返り値は最後に入力した文字
- */
- int sedline(int xl, int yl, char lin[], int lim)
- {
- int i, j, inp1, ptr=0, kp, cnt, insw, q;
- int xl2, yl2;
- char *lin2, *sp;
- int mx, my;
-
- lin2 = lin;
- xl2 = xl; yl2 = yl;
-
- locate(xl, yl, COFF);
- for(i=1; i <= lim; i++) putchar(' ');
- locate(xl, yl, CON);
- printf("%s\n", lin);
- insw = 0;
- for (;;) {
- locate(xl2, yl2, CON);
- do {
- if (kbhit() == 0) {
- if ((MOS_rdpos(&mx, &my) & 0x01) == 1) {
- while((MOS_rdpos(&mx, &my) & 0x01) == 1);
- mx = mx / 8; my = my /16;
- if (sed_xychk(mx, my, xl, yl, xl+lim, yl+1) == 0) return((int)0x0d);
- else {
- if (xl2 != mx) {
- if (xl2 > mx) {
- cnt = xl2 - mx;
- inp1 = 0x1d; /* left */
- } else {
- cnt = mx - xl2;
- inp1 = 0x1c; /* left */
- }
- insw = 1;
- }
- }
- }
- } else {
- inp1 = getch();
- cnt = 1;
- insw = 1;
- }
- } while (insw == 0);
- insw = 0;
-
- for (q = 0; q < cnt; q++) {
- if (inp1 < ' ') {
- switch (inp1) {
- case 0x08 : /* BS */
- if (ptr > 0) {
- kp = chkchr(lin, ptr-1);
- if ((kp == 0) || (kp == 1)) kp = 1;
- else kp = 2;
-
- lin2 = lin + ptr;
- ptr -= kp;
- xl2 -= kp;
- lin[ptr] = '\0';
- strcat(lin, lin2);
- lin2 -= kp;
- locate(xl2, yl2, COFF);
- if (kp == 2) sp = " ";
- else sp = " ";
- printf("%s%s\n", lin2, sp);
- }
- break;
-
- case 0x07 : /* DEL */
- case 0x14 : /* CTRL-T カーソルから右消去 */
- if (inp1 == 0x07) i = 1;
- else i = strlen(lin+ptr);
- for (j = 0; j < i; j++) {
- if (lin[ptr] != '\0') {
- kp = chkchr(lin, ptr);
- if (kp == 0) kp = 1;
- else kp = 2;
-
- lin[ptr] = '\0';
- lin2 = lin+ptr+kp;
- strcat(lin, lin2);
- lin2 -= kp;
- locate(xl2, yl2, COFF);
- if (kp == 2) sp = " ";
- else sp = " ";
- printf("%s%s\n", lin2, sp);
- }
- }
- break;
-
- case 0x1d : /* left */
- if (ptr != 0) {
- kp = chkchr(lin, ptr-1);
- if (kp == 0 || kp == 1) kp = 1;
- else kp = 2;
-
- ptr -= kp;
- xl2 -= kp;
- break;
- }
- break;
- /* return(inp1); */
-
- case 0x1c : /* right */
- if (ptr >= lim-1) break; /* or return(inp1); 入力文字数制限を越えてカーソルを移動することは出来ない */
- if (lin[ptr] != '\0') {
- kp = chkchr(lin, ptr);
- if (kp == 0 || kp == 2) kp = 1;
- else kp = 2;
-
- ptr += kp;
- xl2 += kp;
- break;
- }
- break;
- /* return(inp1); */
- case 0x19 : /* CTRL-Y 一行消去 */
- lin2 = lin;
- *lin2 = 0;
- ptr = 0;
- xl2 = xl; yl2 = yl;
- locate(xl, yl, COFF);
- for(i=1; i <= lim; i++) putchar(' ');
- locate(xl, yl, CON);
- break;
- case 0x1b : /* esc */
- case 0x0d : return(inp1);
- /*
- case 0x1e :
- case 0x1f :
- */
-
- defalt :
- break;
- }
-
- } else {
- i = xl2;
- xl2++;
- lin2 = lin + ptr++;
- sh1(lin2);
- *lin2 = inp1;
- if (kanji1(lin2, 0) == 1) {
- xl2++;
- ptr++;
- sh1(++lin2);
- *lin2-- = getch();
- }
- if (strlen(lin) >= lim) { /* 入力文字数制限 */
- lin[lim] = '\0';
- if (ptr >= lim) {
- ptr = lim-1;
- xl2--;
- }
- }
-
- locate(i, yl2, COFF);
- printf("%s\n", lin2);
- }
- }
- } /* for(;;) end */
- }
-
- /* ポインタの部分から文字列を一文字、右へずらす。 */
- sh1(p)
- char *p;
- {
- int x, y;
-
- y = -1;
- for (;;) {
- x = *p;
- if ((*p++ = y) == 0) break;
- y = *p;
- if ((*p++ = x) == 0) break;
- }
- }
-
-
- int kanji1(p, ptr)
- char p[];
- int ptr;
- {
- int ch;
- ch = p[ptr] & 0xff;
- return(( ((0x81 <= ch) && (ch <= 0x9f)) ||
- ((0xe0 <= ch) && (ch <= 0xfc)) ) ? 1 : 0);
- }
-
-
-
- int chkchr(lin, ptr)
- char *lin;
- int ptr;
- {
- int ptr2;
-
- ptr2 = ptr;
- while ((ptr2 > 0) &&
- (((lin[ptr2] & 0xff) > 0x3f) &&
- ((lin[ptr2] & 0xff) != 0x7f))) {
- ptr2--;
- }
- while (ptr2 < (ptr-1)) {
- if (kanji1(lin, ptr2)) ptr2 += 2;
- else ptr2++;
- }
- if ((ptr2 == (ptr -1)) && kanji1(lin, ptr2)) return(2);
- else {
- if (kanji1(lin, ptr)) return(1);
- else return(0);
- }
- }
-
-
-